/**
 * @file config.h
 * @brief 项目配置头文件
 */

#ifndef CONFIG_H
#define CONFIG_H
#include "debug.h"
#include <Arduino.h>

#define SAMPLES 2048
extern uint8_t currentRainbowDirection; // 定义全局七彩方向
extern bool colorRandomSwitch; // 全局随机颜色开关

extern const char *Version;            
// ==================== 系统信息 ====================
// #define VERSION "1.0.0"              // 固件版本号(已在编译参数中定义)

#define BUTTON_ENTER 0 // 确认按钮编号
#define BUTTON_BACK 3  // 返回按钮编号

// ==================== 其他调试相关配置 ====================

#define HARDWARE_CHECK_ENABLED 1   // 硬件状态检查开关(1=启用,0=禁用)
#define DEBUG_OUTPUT_INTERVAL 3000 // 调试输出间隔调整为3秒

#define FFT_CHANGE_THRESHOLD 0.1f // 频段值变化超过10%才输出调试信息
#define HIGH_FREQ_DEBUG_RATIO 4   // 高频段调试输出频率降低为1/4
#define WARNING_INTERVAL 2000     // 警告输出间隔(ms)

// 效果和颜色方案数量
#define MAX_EFFECT_TYPES 8     // 最大效果类型数量
#define MAX_COLOR_SCHEMES 6    // 最大颜色方案数量
#define LED_STRIP_MODE_COUNT 2 // LED灯带模式数量
#define MAX_STYLES 8           // 最大样式数量

// ==================== 系统参数 ====================
#define AUDIO_UPDATE_INTERVAL 200  // 音频数据和FFT分析更新间隔(ms)
#define DISPLAY_UPDATE_INTERVAL 50 // 显示和效果更新间隔(ms)
#define MAIN_LOOP_DELAY 1          // 主循环延迟时间(ms)
#define SPLASH_SCREEN_DELAY 2000   // 启动画面显示时间(ms)
// 使用Preferences库替代EEPROM，不需要预定义大小

// ==================== 音频硬件配置 ====================
// ==================== 音频处理参数 ====================

#define AUDIO_BUFFER_SIZE 1024 // 音频缓冲区大小
#define FFT_BANDS 32           // FFT频段数量

// 注意：
// 音频输入方式已改为ESP32-S3内置ADC直接采集
// GPIO9和GPIO10分别用于左右声道模拟输入
// I2S音频接口配置
#define I2S_PORT I2S_NUM_0    // I2S端口号
#define I2S_SAMPLE_BITS 24    // PCM1808使用24位采样
#define I2S_SAMPLE_RATE 20000 // I2S采样率44.1kHz
#define I2S_MCLK_PIN 10       // PCM1808主时钟引脚(使用GPIO35)
#define I2S_DOUT_PIN 11       // I2S数据输入引脚(对应PCM1808 DOUT)
#define I2S_BCLK_PIN 12       // I2S时钟引脚(对应PCM1808 BCLK)
#define I2S_LRCK_PIN 13       // I2S字选择引脚(对应PCM1808 LRCLK)

#define VOLUME_SMOOTH_FACTOR 0.1 // 音量平滑因子(0.0-1.0)

// ==================== 显示配置 ====================
// OLED显示屏参数
#define OLED_SDA_PIN 15   // I2C数据线
#define OLED_SCL_PIN 16   // I2C时钟线
#define OLED_RESET -1     // 复位引脚(-1表示不使用)
#define OLED_ADDRESS 0x3C // I2C设备地址
#define SCREEN_WIDTH 128  // 屏幕宽度(像素)
#define SCREEN_HEIGHT 64  // 屏幕高度(像素)

// ==================== LED灯带配置 ====================
#define LED_PIN 45          // LED数据引脚
#define LED_COUNT 2048     // LED总数
#define LED_BRIGHTNESS 100 // 默认亮度(0-255)
#define LED_TYPE WS2815    // LED灯带型号 - 更新为WS2815
#define COLOR_ORDER RGB    // 颜色顺序 - 更新为RGB适配WS2815

// ==================== 按钮配置 ====================
#define BUTTON_MODE_PIN 4     // 模式切换按钮
#define BUTTON_UP_PIN 5       // 向上/增加按钮
#define BUTTON_DOWN_PIN 6     // 向下/减少按钮
#define BUTTON_ENTER_PIN 7    // 确认/进入按钮
#define DEBOUNCE_DELAY 50     // 按钮去抖动延迟时间(ms)
#define LONG_PRESS_DELAY 1000 // 长按时间阈值(ms)

// ==================== 红外接收器配置 ====================
#define IR_RECEIVER_PIN 2    // 红外接收器数据引脚 (使用GPIO18，兼容RMT)

// ==================== 灯带段配置 ====================
#define LED_SEGMENT_SIZE 32     // 每段LED灯默认32个
#define LED_SEGMENT_NUM 32      // 分段默认32
#define MAX_SEGMENTS 32         // 最大分段数量
#define MIN_SEGMENTS 1          // 最小分段数量
#define MAX_LEDS_PER_SEGMENT 50 // 每段最大LED数量
#define MIN_LEDS_PER_SEGMENT 1  // 每段最小LED数量

// ==================== 效果和颜色方案 ====================
#define DEFAULT_EFFECT 0 // 默认效果索引
// 效果总数在effects.h中定义
#define COLOR_SCHEMES_COUNT 6 // 颜色方案总数

// 颜色方案枚举
enum ColorScheme
{
    COLOR_RAINBOW = 0,
    COLOR_FIRE,
    COLOR_OCEAN,
    COLOR_FOREST,
    COLOR_PARTY,
    COLOR_SINGLE,
    COLOR_COUNT // <--- 加上这一行
};

// 灯带模式枚举
enum LedStripMode
{
    LED_MODE_WALL = 0, // 灯带墙模式（每段反转，用于频谱显示）
    LED_MODE_FLOW      // 流水灯模式（正常显示，用于跑马灯效果）
};

// 配置项范围定义
struct ConfigRange
{
    int16_t min;  // 最小值 - 改为int16_t避免溢出
    int16_t max;  // 最大值 - 改为int16_t避免溢出
    int16_t def;  // 默认值 - 改为int16_t避免溢出
    int16_t step; // 步进值 - 改为int16_t避免溢出
};

// 配置项枚举
enum ConfigItem
{
    CONFIG_EFFECT_TYPE,        // 效果类型
    CONFIG_COLOR_SCHEME,       // 颜色方案
    CONFIG_BRIGHTNESS,         // 亮度
    CONFIG_SENSITIVITY,        // 灵敏度
    CONFIG_LED_STRIP_MODE,     // 灯带模式
    CONFIG_SEGMENTS,           // 分段数量
    CONFIG_LEDS_PER_SEGMENT,   // 每段LED数量
    CONFIG_STYLE,              // 灯光样式
    CONFIG_SPEED,              // 速度
    CONFIG_AUTO_CHANGE_EFFECT, // 自动切换效果
    CONFIG_AUTO_CHANGE_TIME,   // 自动切换时间
    CONFIG_MIN_THRESHOLD,      // 最小显示阈值
    CONFIG_NOISE_CHECK,        // 噪声检查开关
    // 新增频谱平滑处理参数
    CONFIG_SPECTRUM_SMOOTHING,  // 频谱平滑系数
    CONFIG_RISE_SPEED,          // 频谱上升速度
    CONFIG_FALL_SPEED,          // 频谱下降速度
    CONFIG_PEAK_DECAY,          // 峰值衰减速度
    CONFIG_PEAK_DOT_DECAY,      // 峰值点衰减速度
    CONFIG_PEAK_HOLD_TIME,      // 峰值点停留时间
    CONFIG_IMPACT_SPEED,        // 冲击速度
    CONFIG_MAX_IMPACT_DISTANCE, // 最大冲击距离
    CONFIG_COLOR_CYCLE_TIME,    // 颜色循环时间
    CONFIG_LOG_SCALE,           // 对数尺度系数
    CONFIG_FAST_DECAY_RATE,     // 静音时快速衰减率
    // ==================== 新增频率补偿参数 ====================
    // 这四个参数控制120频段系统中不同频段的补偿系数
    // 用户可在菜单中调整，实现个性化的频谱显示效果
    CONFIG_LOW_FREQ_COMP,      // 低频补偿系数(0-29频段: 20Hz-200Hz)
    CONFIG_MID_FREQ_COMP,      // 中频补偿系数(30-69频段: 200Hz-2kHz)
    CONFIG_HIGH_MID_FREQ_COMP, // 中高频补偿系数(70-109频段: 2kHz-10kHz)
    CONFIG_HIGH_FREQ_COMP,     // 高频补偿系数(110-119频段: 10kHz-20kHz)
    // ==================== 新增分频段噪声阈值参数 ====================
    // 这四个参数控制120频段系统中不同频段的噪声过滤阈值
    // 用户可在菜单中调整，实现更精确的噪声控制
    CONFIG_LOW_FREQ_NOISE,      // 低频噪声阈值(0-29频段: 20Hz-200Hz)
    CONFIG_MID_FREQ_NOISE,      // 中频噪声阈值(30-69频段: 200Hz-2kHz)
    CONFIG_HIGH_MID_FREQ_NOISE, // 中高频噪声阈值(70-109频段: 2kHz-10kHz)
    CONFIG_HIGH_FREQ_NOISE,     // 高频噪声阈值(110-119频段: 10kHz-20kHz)
    // ==================== 新增频谱压缩比例参数 ====================
    CONFIG_SPECTRUM_COMPRESSION, // 频谱压缩比例(80%-98%, 控制动态范围压缩)

    // ==================== 新增动态频段分配参数 ====================
    CONFIG_BASS_BANDS,     // 低频频段数量(1-50, 默认40) - 控制低频段(20Hz-200Hz)的分配
    CONFIG_MID_BANDS,      // 中频频段数量(1-50, 默认40) - 控制中频段(200Hz-2kHz)的分配
    CONFIG_HIGH_MID_BANDS, // 中高频段数量(1-50, 默认20) - 控制中高频段(2kHz-10kHz)的分配
    CONFIG_HIGH_BANDS,     // 高频频段数量(1-30, 默认10) - 控制高频段(10kHz-20kHz)的分配

    // ==================== 新增节拍检测参数 ====================
    CONFIG_BEAT_SENSITIVITY,  // 节拍灵敏度(10-100, 默认60) - 控制节拍检测的敏感度
    CONFIG_BEAT_THRESHOLD,    // 节拍阈值(0.1-2.0, 默认0.8) - 节拍检测的能量阈值
    CONFIG_BEAT_DECAY_RATE,   // 节拍衰减率(0.1-1.0, 默认0.3) - 节拍信号的衰减速度
    CONFIG_BEAT_MIN_INTERVAL, // 最小节拍间隔(50-500ms, 默认150ms) - 防止过度触发
    CONFIG_BEAT_BOOST_FACTOR, // 节拍增强因子(1.0-5.0, 默认2.5) - 检测到节拍时的视觉增强倍数

    // ==================== 新增频率上限调整参数 ====================
    CONFIG_FREQ_UPPER_LIMIT, // 频率上限(10-48kHz, 默认20kHz, 步进1kHz)

    // ==================== 新增FFT窗函数选择 ====================
    CONFIG_FFT_WINDOW_TYPE, // FFT窗函数类型(0=Rectangle, 1=Hamming, 2=Hann, 3=Blackman)

    // ==================== 新增峰值点配置参数 ====================
    CONFIG_PEAK_DOT_COUNT,  // 峰值点数量(0=关闭, 1=1个, 2=2个)
    CONFIG_PEAK_DOT_COLOR,  // 峰值点颜色(0=七彩, 1=红色, 2=绿色, 3=蓝色, 4=黄色, 5=白色)
    CONFIG_VOLUME_ADAPTIVE, // 音量自适应开关(0=关闭, 1=开启)

    // 七彩相关参数
    CONFIG_RAINBOW_TYPE,      // 类型（0=全彩, 1=冷色, 2=暖色）
    CONFIG_RAINBOW_SPEED,     // 速度（1-100）
    CONFIG_RAINBOW_SMOOTH,    // 平滑（1-100）
    CONFIG_RAINBOW_DIRECTION, // 方向（0-7）
    // 渐变相关参数
    CONFIG_GRADIENT_SPEED,  // 速度（1-100）
    CONFIG_GRADIENT_SMOOTH, // 平滑（1-100）
    // 单色模式相关参数
    CONFIG_SOLID_COLOR_HUE, // 单色色调 (0-255)

    CONFIG_COUNT // 配置项总数
};

// 配置结构体
/**
 * @brief 系统配置结构体
 *
 * 包含所有可配置的系统参数，存储在EEPROM中
 */
struct Config
{
    uint8_t magicNumber;     // 配置有效性验证魔数(0x55) - 保持uint8_t
    int16_t effectType;      // 当前效果类型索引(0-EFFECT_COUNT-1) - 改为int16_t
    int16_t colorScheme;     // 当前颜色方案索引(0-COLOR_SCHEMES_COUNT-1) - 改为int16_t
    int16_t brightness;      // LED亮度(0-255) - 改为int16_t
    int16_t sensitivity;     // 音频输入灵敏度(0-100) - 改为int16_t
    int16_t ledStripMode;    // 灯带模式(LED_MODE_WALL/LED_MODE_FLOW) - 改为int16_t
    int16_t segments;        // 音柱/灯带段数(1-32) - 改为int16_t
    int16_t ledsPerSegment;  // 每段LED数量(MIN_LEDS_PER_SEGMENT-MAX_LEDS_PER_SEGMENT) - 改为int16_t
    int16_t style;           // 灯光样式(0-255) - 改为int16_t
    int16_t speed;           // 效果速度(0-100) - 改为int16_t
    bool autoChangeEffect;   // 是否自动切换效果(true/false) - 保持bool
    uint32_t autoChangeTime; // 自动切换间隔时间(ms) - 保持uint32_t
    float minThreshold;      // 最小显示阈值(0.0-0.2) - 保持float
    bool noiseCheckEnabled;  // 噪声检查开关状态 - 保持bool

    // 新增频谱平滑处理参数 - 保持float
    float spectrumSmoothing;   // 频谱平滑系数(0.0-1.0, 默认0.3)
    float riseSpeed;           // 频谱上升速度(0.0-1.0, 默认0.2)
    float fallSpeed;           // 频谱下降速度(0.0-1.0, 默认0.4)
    float peakDecay;           // 峰值衰减速度(0.0-1.0, 默认0.15)
    float peakDotDecay;        // 峰值点衰减速度(0.0-1.0, 默认0.02)
    float peakHoldTime;        // 峰值点停留时间(0.0-1.0, 默认0.8)
    float impactSpeed;         // 冲击速度(0.0-10.0, 默认3.5)
    int16_t maxImpactDistance; // 最大冲击距离(1-20, 默认5) - 改为int16_t
    uint16_t colorCycleTime;   // 颜色循环时间(5-60秒, 默认30秒) - 保持uint16_t
    float logScale;            // 对数尺度系数(1.0-3.0, 默认1.5)
    float fastDecayRate;       // 静音时快速衰减率(0.0-1.0, 默认0.5)

    // FFT处理相关参数 - 保持float和bool
    float minBandValue;        // 频段最小值(用于归一化)
    float maxBandValue;        // 频段最大值(用于归一化)
    float normalizationFactor; // 归一化因子
    bool debugNormalization;   // 归一化调试开关

    // 新增频率补偿参数 - 保持float
    float lowFreqComp;     // 低频补偿系数(0-29频段, 0.5-2.0, 默认0.8)
    float midFreqComp;     // 中频补偿系数(30-69频段, 0.5-2.0, 默认1.0)
    float highMidFreqComp; // 中高频补偿系数(70-109频段, 0.5-2.0, 默认1.2)
    float highFreqComp;    // 高频补偿系数(110-119频段, 0.5-2.0, 默认1.5)

    // 新增分频段噪声阈值 - 保持float
    float lowFreqNoise;     // 低频噪声阈值(0-29频段, 0.01-1.0, 默认0.3)
    float midFreqNoise;     // 中频噪声阈值(30-69频段, 0.01-1.0, 默认0.5)
    float highMidFreqNoise; // 中高频噪声阈值(70-109频段, 0.01-1.0, 默认0.7)
    float highFreqNoise;    // 高频噪声阈值(110-119频段, 0.01-1.0, 默认0.8)

    // 新增频谱压缩比例 - 保持float
    float spectrumCompression; // 频谱压缩比例(0.8-0.98, 默认0.9)

    // 新增动态频段分配和节拍检测配置变量
    int16_t bassBands;    // 低频频段数量(1-30, 控制20Hz-200Hz分配) - 改为int16_t
    int16_t midBands;     // 中频频段数量(1-40, 控制200Hz-2kHz分配) - 改为int16_t
    int16_t highMidBands; // 中高频段数量(1-40, 控制2kHz-10kHz分配) - 改为int16_t
    int16_t highBands;    // 高频频段数量(1-20, 控制10kHz-20kHz分配) - 改为int16_t

    // 节拍检测配置
    int16_t beatSensitivity;  // 节拍灵敏度(10-100, 控制检测敏感度) - 改为int16_t
    float beatThreshold;      // 节拍阈值(0.1-2.0, 控制能量触发点) - 保持float
    float beatDecayRate;      // 节拍衰减率(0.1-1.0, 控制信号衰减速度) - 保持float
    uint16_t beatMinInterval; // 最小节拍间隔(50-500ms, 防止过度触发) - 保持uint16_t
    float beatBoostFactor;    // 节拍增强因子(1.0-5.0, 控制视觉增强倍数) - 保持float

    // 新增频率上限调整
    uint16_t freqUpperLimit; // 频率上限(10000-48000Hz, 默认20000Hz, 步进1000Hz) - 保持uint16_t

    // ==================== 新增FFT窗函数选择 ====================
    int16_t fftWindowType; // FFT窗函数类型(0=Rectangle, 1=Hamming, 2=Hann, 3=Blackman) - 改为int16_t

    // ==================== 新增峰值点配置参数 ====================
    int16_t peakDotCount; // 峰值点数量(0=关闭, 1=1个, 2=2个) - 改为int16_t
    int16_t peakDotColor; // 峰值点颜色(0=七彩, 1=红色, 2=绿色, 3=蓝色, 4=黄色, 5=白色) - 改为int16_t

    // ==================== 新增音量自适应开关 ====================
    bool volumeAdaptive; // 音量自适应开关(true=开启, false=关闭) - 保持bool

    // 七彩相关参数
    int16_t rainbowType;      // 类型（0=全彩, 1=冷色, 2=暖色） - 改为int16_t
    int16_t rainbowSpeed;     // 速度（1-100） - 改为int16_t
    int16_t rainbowSmooth;    // 平滑（1-100） - 改为int16_t
    int16_t rainbowDirection; // 方向（0-7） - 改为int16_t
    // 渐变相关参数
    int16_t gradientSpeed;  // 速度（1-100） - 改为int16_t
    int16_t gradientSmooth; // 平滑（1-100） - 改为int16_t
    // 单色模式相关参数
    int16_t solidColorHue; // 单色色调 (0-255) - 改为int16_t
};

// 全局配置变量声明
extern Config g_config;
extern const ConfigRange g_configRanges[CONFIG_COUNT];

// 配置有效性标记
#define CONFIG_VALID_MARKER 0x55

// 配置相关函数声明
const ConfigRange &getConfigRange(ConfigItem item);
int16_t clampConfigValue(ConfigItem item, int16_t value);
int16_t getConfigDefault(ConfigItem item);
bool resetConfig();

/**
 * @brief 检查并限制配置值在有效范围内
 *
 * @param item 配置项枚举值
 * @param value 要检查的值
 * @return int16_t 限制后的有效值
 */
int16_t clampConfigValue(ConfigItem item, int16_t value);

/**
 * @brief 获取配置项的默认值
 *
 * @param item 配置项枚举值
 * @return int16_t 该配置项的默认值
 */
int16_t getConfigDefault(ConfigItem item);

// 通用存储函数
uint8_t readFromStorage(uint16_t address);
void writeToStorage(uint16_t address, uint8_t value);

/**
 * @brief 初始化存储系统
 *
 * @return true 初始化成功
 * @return false 初始化失败
 */
bool initStorage();

/**
 * @brief 保存配置到Preferences存储
 *
 * @return true 保存成功
 * @return false 保存失败
 */
bool saveConfig();

/**
 * @brief 从Preferences存储加载配置
 *
 * @return true 加载成功
 * @return false 加载失败
 */
bool loadConfig();

/**
 * @brief 重置Preferences存储中的配置为默认值
 *
 * @return true 重置成功
 * @return false 重置失败
 */
bool resetStoredConfig();

/**
 * @return false 无有效配置
 */
bool hasValidConfig();

#endif // CONFIG_H